package openIDService;

import gestioneDatabase.User.UserManager;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import models.User;
import openIDServiceUtilities.SpecificUserFiller;

import org.openid4java.association.AssociationException;
import org.openid4java.consumer.ConsumerException;
import org.openid4java.discovery.DiscoveryException;
import org.openid4java.discovery.DiscoveryInformation;
import org.openid4java.message.MessageException;
import org.openid4java.message.ParameterList;

import utilities.GestoreLink;

/**
 * Il processo di verifica dell'utente una volta effettuato il login.
 * 
 */
public class Verification implements OpenIDService {

	private static SpecificUserFiller userFiller = new SpecificUserFiller();

	/**
	 * Esegue il processo di verifica: le informazioni precedentemente rilevate
	 * riguardanti l'utente, basate solo sulla string fornita che DEVE essere stata
	 * salvata nella sessione con nome di attributo "discoveredInformation", sono 
	 * confrontate con le informazioni in arrivo dal provider OpenID (OP) dopo che
	 * l'autenticazione ha avuto successo.
	 * 
	 * @return L'oggetto {@link User} contentente tutti i dati recuperati dall'OP
	 *
	 * @param request
	 * 			  L'oggetto @link {@link HttpServletRequest} contenente la richiesta del client.
	 * 			  E' necessario effettuare il reindirizzament e salvare il semi-risultato
	 * 			  dell'autenticazione nella sessione.
	 * 
	 * @param userID
	 * 			  Stringa contenente l'url OpenID associati con l'utente. 
	 * 
	 */
	@Override
	public User execute(HttpServletRequest request, String userID)
			throws DiscoveryException, MessageException, ConsumerException,
			AssociationException {

		ParameterList parameters = new ParameterList(request.getParameterMap());

		DiscoveryInformation discovered = (DiscoveryInformation) request
				.getSession().getAttribute("discoveredInformation");

		User ret = userFiller.fillUser(discovered, parameters, GestoreLink
				.getGestore().getElement("Forum"));
		
		if (ret != null) {
			HashMap<String, User> usersList = UserManager.getUserManager().getUsers();
			
	
			if (!usersList.containsKey(ret.getOpenId())) {
				System.out.println("registering user "+ret.getEmailAddress());
				UserManager.getUserManager().InsertUser(ret);
				
			} else {
				ret = usersList.get(ret.getOpenId());
			}
			
			request.getSession().setAttribute("identity", ret);
		}
		return ret;
	}

}